/*-------------------------------------------------------------------------
 *
 * basebackup_sink.c
 *	  bbsink（基础备份接收器）回调的默认实现。
 *
 * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group
 *
 * src/backend/backup/basebackup_sink.c
 *
 *-------------------------------------------------------------------------
 */

#include "postgres.h"

#include "backup/basebackup_sink.h"

/*
 * 转发 begin_backup 回调。
 *
 * 仅在您希望实现的 bbsink 与后续 bbsink
 * 共享缓冲区时使用此实现。
 */
void bbsink_forward_begin_backup(bbsink *fc_sink)
{
	Assert(fc_sink->bbs_next != NULL);
	Assert(fc_sink->bbs_state != NULL);
	bbsink_begin_backup(fc_sink->bbs_next, fc_sink->bbs_state,
						fc_sink->bbs_buffer_length);
	fc_sink->bbs_buffer = fc_sink->bbs_next->bbs_buffer;
}

/*
 * 转发 begin_archive 回调。
 */
void bbsink_forward_begin_archive(bbsink *fc_sink, const char *fc_archive_name)
{
	Assert(fc_sink->bbs_next != NULL);
	bbsink_begin_archive(fc_sink->bbs_next, fc_archive_name);
}

/*
 * 转发 archive_contents 回调。
 *
 * 希望使用此代码的应该将其自己的 bbs_buffer 和
 * bbs_buffer_length 字段初始化为后续 sink 的值。在 
 * 缓冲区未共享的情况下，数据需要在转发 
 * 回调之前复制。我们在这里不这样做，因为
 * 真的没有理由拥有包含相同数据的单独分配的缓冲区。
 */
void bbsink_forward_archive_contents(bbsink *fc_sink, size_t fc_len)
{
	Assert(fc_sink->bbs_next != NULL);
	Assert(fc_sink->bbs_buffer == fc_sink->bbs_next->bbs_buffer);
	Assert(fc_sink->bbs_buffer_length == fc_sink->bbs_next->bbs_buffer_length);
	bbsink_archive_contents(fc_sink->bbs_next, fc_len);
}

/*
 * 转发 end_archive 回调。
 */
void bbsink_forward_end_archive(bbsink *fc_sink)
{
	Assert(fc_sink->bbs_next != NULL);
	bbsink_end_archive(fc_sink->bbs_next);
}

/*
 * 转发 begin_manifest 回调。
 */
void bbsink_forward_begin_manifest(bbsink *fc_sink)
{
	Assert(fc_sink->bbs_next != NULL);
	bbsink_begin_manifest(fc_sink->bbs_next);
}

/*
 * 转发 manifest_contents 回调。
 *
 * 与 archive_contents 回调一样，预计缓冲区也是
 * 共享的。
 */
void bbsink_forward_manifest_contents(bbsink *fc_sink, size_t fc_len)
{
	Assert(fc_sink->bbs_next != NULL);
	Assert(fc_sink->bbs_buffer == fc_sink->bbs_next->bbs_buffer);
	Assert(fc_sink->bbs_buffer_length == fc_sink->bbs_next->bbs_buffer_length);
	bbsink_manifest_contents(fc_sink->bbs_next, fc_len);
}

/*
 * 转发 end_manifest 回调。
 */
void bbsink_forward_end_manifest(bbsink *fc_sink)
{
	Assert(fc_sink->bbs_next != NULL);
	bbsink_end_manifest(fc_sink->bbs_next);
}

/*
 * 转发 end_backup 回调。
 */
void bbsink_forward_end_backup(bbsink *fc_sink, XLogRecPtr fc_endptr, TimeLineID fc_endtli)
{
	Assert(fc_sink->bbs_next != NULL);
	bbsink_end_backup(fc_sink->bbs_next, fc_endptr, fc_endtli);
}

/*
 * 转发 cleanup 回调。
 */
void bbsink_forward_cleanup(bbsink *fc_sink)
{
	Assert(fc_sink->bbs_next != NULL);
	bbsink_cleanup(fc_sink->bbs_next);
}
